﻿using System;
using System.Collections.Generic;

namespace LAPI.Business.Acciones
{

    /// <summary>
    /// Clase para realizar la acción: validar si se puede realizar una reserva
    /// </summary>
    public class AccValidarReserva
    {
        /// <summary>
        /// Logger de la clase
        /// </summary>
        private LAPI.Core.Logging.ILogger logger;

        /// <summary>
        /// Constructor
        /// </summary>
        public AccValidarReserva()
        {
            logger = LAPI.Core.Logging.LoggerFactory.CreateLogger(type: typeof(AccValidarReserva));
        }

        /// <summary>
        /// Método para realizar la acción de validar si se puede realizar una reserva
        /// <p>
        /// El método realiza las siguientes funciones:
        /// <ul>
        /// <li>Comprueba que no haya ninguna reserva en este horario</li>  
        /// <li>Comprueba que la fecha sea posterior</li>  
        /// <li>Comprueba que la fecha no sea superior a un mes</li>  
        /// </ul>
        /// </p>
        /// </summary>
        /// <param name="datosReserva">Modelo con los datos de la reserva</param>
        /// <param name="idPista">Identificador único de la pista</param>
        /// <returns>ResultadoAccion, con el resultado de la operación</returns>
        /// <seealso cref="Reserva"/>
        /// <seealso cref="GestorReservas"/>
        /// <seealso cref="ResultadoAccion"/>
        /// <seealso cref="TipoResultado"/>
        /// <seealso cref="TipoMensaje"/>
        public ResultadoAccion ValidarReserva(LAPI.Data.Model.Reserva datosReserva, Int32 idPista)
        {
            logger.Debug("[ValidarReserva] Comienzo");
            logger.Debug("[ValidarReserva] Datos:" + datosReserva);

            ResultadoAccion res = new ResultadoAccion();

            try
            {
                //0. Comprueba que no haya ninguna reserva en este horario
                Gestores.GestorReservas gestor = new Gestores.GestorReservas();
                if (!gestor.ComprobarPeriodoReserva(datosReserva: datosReserva, idPista: idPista ))
                {
                    res.addMensaje(mensaje: "Ya existe una reserva en ese período.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //1. Comprueba que la fecha sea posterior
                if (datosReserva.horaInicio.CompareTo(DateTime.Now) < 0)
                {
                    res.addMensaje(mensaje: "No se puede realizar una reserva de una fecha anterior.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //2. Comprueba que la fecha no sea más de un mes posterior
                TimeSpan ts = datosReserva.horaInicio - DateTime.Now.AddMonths(1);
                if (ts.Days > 0)
                {
                    res.addMensaje(mensaje: "No se puede realizar una reserva de una fecha un mes posterior.", tipoMensaje: TipoMensaje.ALERTA);
                    res.setResultado(TipoResultado.ERROR);
                    return res;
                }

                //TODO OK
                res.setResultado(TipoResultado.CORRECTO);
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                res.addMensaje(mensaje: "No ha sido posible validar los datos de la reserva", tipoMensaje: TipoMensaje.ERROR);
                res.setResultado(TipoResultado.ERROR);
            }

            logger.Debug("[ValidarReserva] Fin");
            return res;
        }
    }
}
